package codeauto;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;

import java.util.*;

@Slf4j
public class TemplateCodeGenerator {

    public static void main(String[] args) {
        //String module = ".progress";
        String module = "";
        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig
                //.setAuthor("Auto Generator") // 设置作者
                .setAuthor("Johnny") // 设置作者
                .setActiveRecord(false) // 是否支持AR模式，模板中已此项去掉，所以无效
                // .setOutputDir("E:\\works\\taihu\\src\\main\\java") // 生成文件的路径
                // .setOutputDir("E:\\works\\cornerstone\\src\\main\\java") // 生成文件的路径
//                .setOutputDir(
//                        "/Users/johnny/atw-project/bigmes/auto-code/auto") // 生成文件的路径
                .setOutputDir(
                        "/Users/johnny/atw-project/bigmes/jpa-auto-code/backend-server/src/main/java") // 生成文件的路径
                .setFileOverride(false) // 文件覆盖
                .setOpen(false) // 生成完成之后是否打开输出目录
                .setIdType(IdType.AUTO) // 主键策略
                .setBaseResultMap(true)
                .setBaseColumnList(false)
                .setSwagger2(true)
                .setDateType(DateType.ONLY_DATE); // 所有日期类型都使用java.utils.Date


        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig
                .setDbType(DbType.MYSQL)
                //                .setUrl(
                //
                // "jdbc:mysql://192.168.15.31:3309/pkgs_mes?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai")
                .setUrl(
                        "jdbc:mysql://192.168.15.46:3306/mes_manufacturing_manager?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai")
                .setDriverName("com.mysql.jdbc.Driver")
                .setUsername("root")
                .setPassword("123456");

        // 策略配置

        /**
         * 设备 .setInclude( "silver_paste_receive_log", "silver_paste_return_log",
         * "sliver_paste_change_log_reason", "halftone_change_log_reason", "halftone_offline_log",
         * "halftone_online_log")
         *
         * <p>setInclude( "product_bom", "product_bom_detail", "production_line_unit_status",
         * "production_line_procedure_group_status", "production_task",
         * "production_line_work_order", "production_line_work_order_detail")
         */
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setCapitalMode(true) // 全局大写
                .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                .setEntityTableFieldAnnotationEnable(true) // 是否全部生成@TableField注释
                // .setExclude("user") // 排除某一个表
                .setInclude("product_bom")
                .setChainModel(false)
                .setEntityLombokModel(true)
                .setEntityColumnConstant(true)
                .setEntitySerialVersionUID(false)
                .setRestControllerStyle(true); // Controller是否Rest风格


        // strategyConfig.setInclude("t_user"); // 不指定表名就全部表都生成
        // strategyConfig.setTablePrefix("pkg_"); // 表前缀


        // 包名策略
        PackageConfig packageConfig = new PackageConfig();
        packageConfig
                .setParent("com.weareint.biz")
                .setEntity("entity" + module)
                .setMapper("repository" + module)
                .setService("service" + module)
                .setServiceImpl("service" + module + ".impl")
                .setController("controller" + module)
                .setXml("dao" + module + ".xml");

        // 模板配置
        TemplateConfig templateConfig = new TemplateConfig();
        // 添加自定义的模板
        templateConfig
                .setController("/templates/vms/JPAController.java")
                .setServiceImpl("/templates/vms/JPAServiceImpl.java")
                .setService("/templates/vms/JPAService.java")
                //.setEntity("/templates/vms/Entity.java");
                .setEntity("/templates/vms/JPAEntity.java")
                .setMapper(null)
                //JPA 不生成 xml
                .setXml(null);
        boolean genDTO = true; // 是否生成DTO
        templateConfig.disable(
                //                 TemplateType.CONTROLLER // , // 不生成Controller
                //                 TemplateType.SERVICE, // 不生成Service
                //                 TemplateType.MAPPER // 不生成Mapper
                //                 TemplateType.XML // 不生成Mapper.xml
        );

        // 自定义配置
        List<FileOutConfig> fileOutConfigs = new ArrayList<>();
        // 添加生成对应于Entity的DTO

//
//        fileOutConfigs.add(new FileOutConfig() {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return null;
//            }
//        })


        if (genDTO) {

            fileOutConfigs.add(
                    new FileOutConfig("/templates/vms/JPARepository.java.vm") {
                        @Override
                        public String outputFile(TableInfo tableInfo) {
                            return globalConfig.getOutputDir()
                                    + "/"
                                    + packageConfig.getParent().replaceAll("\\.", "/")
                                    + "/repository/" + module.replace(".", "") + "/"
                                    + tableInfo.getEntityName()
                                    + "Repository.java";
                        }
                    });

            //search
            fileOutConfigs.add(
                    new FileOutConfig("/templates/vms/SearchVo.java.vm") {
                        @Override
                        public String outputFile(TableInfo tableInfo) {
                            return globalConfig.getOutputDir()
                                    + "/"
                                    + packageConfig.getParent().replaceAll("\\.", "/")
                                    + "/search/" + module.replace(".", "") + "/"
                                    + tableInfo.getEntityName()
                                    + "Search.java";
                        }
                    });

            fileOutConfigs.add(
                    new FileOutConfig("/templates/vms/Vo.java.vm") {
                        @Override
                        public String outputFile(TableInfo tableInfo) {
                            return globalConfig.getOutputDir()
                                    + "/"
                                    + packageConfig.getParent().replaceAll("\\.", "/")
                                    + "/vo/" + module.replace(".", "") + "/"
                                    + tableInfo.getEntityName()
                                    + "Vo.java";
                        }
                    });

            //converter
            fileOutConfigs.add(new FileOutConfig("/templates/vms/Converter.java.vm") {
                @Override
                public String outputFile(TableInfo tableInfo) {

                    return globalConfig.getOutputDir()
                            + "/"
                            + packageConfig.getParent().replaceAll("\\.", "/")
                            + "/converter/" + module.replace(".", "") + "/"
                            + tableInfo.getEntityName()
                            + "Converter.java";
                }
            });
//
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/BaseEntity.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//
//                    return globalConfig.getOutputDir()
//                            + "/" + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/"
//                            + "BaseEntity.java";
//                }
//            });
//
//            //JpaAuditorAware
//            fileOutConfigs.add(new FileOutConfig("/templates/vms/JpaAuditorAware.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//
//                    return globalConfig.getOutputDir()
//                            + "/" + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/"
//                            + "JpaAuditorAware.java";
//                }
//            });
//
//            //baseVo
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/BaseVo.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//
//                    return globalConfig.getOutputDir()
//                            + "/" + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/"
//                            + "BaseVo.java";
//                }
//            });
//

            //PageVo
//
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/PageVo.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/" + module.replace(".", "") + "/"
//                            + "PageVo.java";
//                }
//            });
//
//            //PageUtil
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/PageUtil.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/" + module.replace(".", "") + "/"
//                            + "PageUtil.java";
//                }
//            });
//
//            //ResultVo
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/ResultVo.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/" + module.replace(".", "") + "/"
//                            + "ResultVo.java";
//                }
//            });
//
//            //ResultVoUtil
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/ResultVoUtil.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/" + module.replace(".", "") + "/"
//                            + "ResultVoUtil.java";
//                }
//            });
//
//            //BaseService
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/BaseService.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/" + module.replace(".", "") + "/"
//                            + "BaseService.java";
//                }
//            });
//
//            //ConditionService
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/ConditionService.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/" + module.replace(".", "") + "/"
//                            + "ConditionService.java";
//                }
//            });
//
//            //QueryCondition
//            fileOutConfigs.add(new FileOutConfig("/templates/basevms/QueryCondition.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/jpabase/" + module.replace(".", "") + "/"
//                            + "QueryCondition.java";
//                }
//            });
//
//            fileOutConfigs.add(new FileOutConfig("/templates/exceptionvms/BaseErrorInterface.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/exception/" + module.replace(".", "") + "/"
//                            + "BaseErrorInterface.java";
//                }
//            });
//
//            fileOutConfigs.add(new FileOutConfig("/templates/exceptionvms/BizException.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/exception/" + module.replace(".", "") + "/"
//                            + "BizException.java";
//                }
//            });
//
//
//            fileOutConfigs.add(new FileOutConfig("/templates/exceptionvms/ExceptionEnum.java.vm") {
//                @Override
//                public String outputFile(TableInfo tableInfo) {
//                    return globalConfig.getOutputDir()
//                            + "/"
//                            + packageConfig.getParent().replaceAll("\\.", "/")
//                            + "/exception/" + module.replace(".", "") + "/"
//                            + "ExceptionEnum.java";
//                }
//            });



        }
        // 添加自定义配置中的参数
        InjectionConfig injectionConfig =
                new InjectionConfig() {
                    @Override
                    public void initMap() {
                        Map<String, Object> map = new HashMap<>();
                        map.put("lombok", true); // 启用lombok，在模板中使用${cfg.lombok}
                        //map.put("jpaBasePkg", packageConfig.getParent() + ".jpabase");
                        map.put("jpaBasePkg", "com.weareint.common" + ".jpabase");
                        //map.put("exceptionPkg", packageConfig.getParent() + ".exception");
                        map.put("exceptionPkg", "com.weareint.common" + ".exception");
                        map.put("converterPkg", packageConfig.getParent() + ".converter" + module);
                        map.put("repositoryPkg", packageConfig.getParent() + ".repository" + module);
                        map.put(
                                "voPkg",
                                packageConfig.getParent() + ".vo" + module); // 生成Vo时的包路径
                        map.put(
                                "searchPkg",
                                packageConfig.getParent() + ".search" + module); // 生成Vo时的包路径
                        map.put("swaggerTagName", "业务接口");
                        map.put("servicePort", "8082");
                        map.put(
                                "commonCols",
                                Lists.newArrayList(
                                        "id",
                                        "create_time",
                                        "update_time",
                                        "creator",
                                        "updater")); // 所有实体都具有基础属性
                        map.put(
                                "withoutToEntityCols",
                                Lists.newArrayList(
                                        "create_time",
                                        "update_time",
                                        "creator",
                                        "updater")); // 所有实体都具有基础属性
                        map.put(
                                "entityExcludePkgs",
                                Lists.newArrayList(
                                        "com.baomidou.mybatisplus.annotation.TableId",
                                        "com.baomidou.mybatisplus.annotation.IdType",
                                        "java.io.Serializable")); // Entity中不引入的包
                        this.setMap(map);
                    }
                };
        injectionConfig.setFileOutConfigList(fileOutConfigs);


        // 开始生成
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator
                .setDataSource(dataSourceConfig)
                .setPackageInfo(packageConfig)
                .setTemplate(templateConfig)
                .setGlobalConfig(globalConfig)
                .setCfg(injectionConfig)
                .setStrategy(strategyConfig);
        autoGenerator.execute();
    }

}
